package com.example.myapplicationktkt2.mini

import android.os.Bundle
import android.util.Log
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplicationktkt2.R
import com.example.myapplicationktkt2.log.Logger

/**
 * MiniMainActivity2 是一个用于展示小程序的Activity。
 * 它使用WebView作为渲染引擎，并通过JavaScript接口与小程序进行通信。
 * 该Activity解决了Android渲染问题，并提供了完善的错误处理机制。
 */
class MiniMainActivity2 : AppCompatActivity() {

    private lateinit var webView: WebView
    private lateinit var bridge: MiniAppBridge

    /**
     * 当Activity创建时调用此方法。
     * 负责初始化WebView，设置相关配置，并加载小程序资源。
     *
     * @param savedInstanceState 如果Activity之前被销毁并重新创建，
     *                           此Bundle包含之前保存的状态信息
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_webview_demo)
        
        Logger.d("MiniMainActivity2", "onCreate called")

        webView = findViewById(R.id.webview)
        
        // 禁用硬件加速以解决"Failed to open rendernode"问题
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
        
        setupWebView()

        bridge = MiniAppBridge(webView)
        webView.addJavascriptInterface(bridge, "__nativeBridge")

        // 调试时允许远程调试（Chrome://inspect）
        WebView.setWebContentsDebuggingEnabled(true)

        // 检查assets中是否存在miniapp文件夹，如果不存在则加载默认页面
        try {
            val assetManager = assets
            val files = assetManager.list("miniapp")
            if (files != null && files.isNotEmpty()) {
                Logger.d("MiniMainActivity2", "Loading miniapp from assets")
                // 加载 assets 下的 demo 小程序
                webView.loadUrl("file:///android_asset/miniapp/index.html")
            } else {
                Logger.w("MiniMainActivity2", "Miniapp folder not found in assets, loading default page")
                // 如果没有找到miniapp文件夹，加载一个简单的HTML页面
                webView.loadData("<html><body><h1>Mini Program Demo</h1><p>Asset files not found.</p></body></html>", "text/html", "UTF-8")
            }
        } catch (e: Exception) {
            Logger.e("MiniMainActivity2", "Error loading assets: ${e.message}")
            // 出现异常时加载一个简单的HTML页面
            webView.loadData("<html><body><h1>Mini Program Demo</h1><p>Error loading assets: ${e.message}</p></body></html>", "text/html", "UTF-8")
        }
    }

    /**
     * 配置WebView的设置参数。
     * 包括启用JavaScript、DOM存储，设置渲染优先级等，以确保小程序能够正常运行。
     */
    private fun setupWebView() {
        Logger.d("MiniMainActivity2", "Setting up WebView")
        val ws: WebSettings = webView.settings
        ws.javaScriptEnabled = true
        ws.domStorageEnabled = true
        ws.allowFileAccess = true
        ws.allowContentAccess = true
        // 视情况开启 mixed content
        ws.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        
        // 设置渲染优先级和缓存模式以提高兼容性
        ws.setRenderPriority(WebSettings.RenderPriority.HIGH)
        ws.cacheMode = WebSettings.LOAD_NO_CACHE
        
        // 禁用媒体播放需要用户手势，提高兼容性
        ws.mediaPlaybackRequiresUserGesture = false

        webView.webChromeClient = WebChromeClient()
    }

    /**
     * 当Activity被销毁时调用此方法。
     * 负责安全地释放WebView资源，避免内存泄漏。
     */
    override fun onDestroy() {
        Logger.d("MiniMainActivity2", "onDestroy called")
        // 安全回收 WebView
        try {
            (webView.parent as? android.view.ViewGroup)?.removeView(webView)
            webView.stopLoading()
            webView.settings.javaScriptEnabled = false
            webView.clearHistory()
            webView.removeAllViews()
            webView.destroy()
        } catch (e: Exception) {
            Logger.e("MiniMainActivity2", "Error destroying WebView: ${e.message}")
            Log.e("MiniMainActivity2", "Error destroying WebView", e)
        }
        super.onDestroy()
    }
}